package com.example.synchronizedLearning;

public class Syn6 {
    /**
     * synchronized(this) 锁住的是当前对象。
     * 如果两个方法都被 synchronized 锁住，线程会发生互斥。
     */
    public void printA() {
        synchronized (this) {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public void printB() {
        synchronized (this) {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

class Syn6Test {
    public static void main(String[] args) {

        Syn6 syn6 = new Syn6();

        Thread t1 = new Thread(syn6::printA);
        Thread t2 = new Thread(syn6::printB);

        t1.setName("t1");
        t2.setName("t2");

        /**
         * printA() 和 printB() 都是实例方法。
         * synchronized 使得 printA() 和 printB() 都锁住当前对象（this）。
         * 线程 t1 执行 printA()，会锁住对象。
         * 线程 t2 需要等待 t1 释放锁，才能进入 printB()。
         */

        t1.start();
        t2.start();

    }
}
